package edu.biwu.sms.Annotation;

import edu.biwu.sms.Stduent;

import java.lang.reflect.Field;

public class ValidationProcessor {
    /**
     * 验证给定的对象中的所有加了注解的字段,检验是否符合给定的规则
     * @param student
     * @return
     */
    public static boolean validate(Stduent student) throws IllegalAccessException {
        //1.设定一个变量isValid,如果有某个字段校验失败,就代表该对象不合法
        // isValid就会被置为false
        boolean isvalida=true;

//        Class<? extends Stduent> stuCalss = student.getClass();
        for( Class<? > cls =student.getClass();cls!=Object.class;cls=cls.getSuperclass()) {
            for (Field field : cls.getDeclaredFields()) {
                //4.跳过Java的权限访问检查,能够用来设置和获取私有字段的值
                //暴力反射
                field.setAccessible(true);
                //5.判断字段上是否有@Validate注解,如果有在进行校验逻辑
                if (field.isAnnotationPresent(Validate.class)) {
                    //6.获取对象中指定字段的值
                    Object value = field.get(student);
                    //7.获取@Validate注解
                    Validate validation = field.getAnnotation(Validate.class);

                    //8.处理正则表达式校验
                    if (!validation.regex().isEmpty() && field.getType().equals(String.class)) {
                        //如果正则表达式不为空串并且字段属性类型为String类型
                        String strVal = (String) value;
                        if (!strVal.matches(validation.regex())) {
                            System.out.println("字段 " + field.getName() + " 的格式校验失败");
                            isvalida = false;
                        }
                    }
                    //处理分数的值的校验
                    if (field.getType().equals(Double.class)) {
                        if (value != null) {
                            Double doubleValue = (Double) value;
                            if (doubleValue < validation.min() || doubleValue > validation.max()) {
//                            超出了[min,max]范围
                                System.out.println("字段 " + field.getName() + " 的校验数值范围失败");
                                isvalida = false;
                            }
                        }
                    }
                }
            }
        }
            return isvalida;

    }
}
